// Effective C++ 条款23：宁以non-member non-friend函数替换member函数
// 核心原则
// 当一个函数不需要访问类的非公有成员时，最好将其定义为非成员非友元函数，而不是成员函数。
// 主要理由
// 1. 提高封装性
//      封装性与"可访问的数据量"成反比
//      成员函数和友元函数可以访问类的私有部分
//      非成员非友元函数只能访问公有接口，提高了封装性
// 2. 增加包裹弹性和功能扩展性
//      非成员函数可以定义在不同的命名空间中
//      允许用户扩展你的类功能，而无需修改原始类
// 3. 降低编译依赖
//      非成员函数不需要包含完整的类定义，只需要类的声明
//      这减少了编译依赖，提高了编译速度

// 代码示例
// 假设我们有一个表示Web浏览器的类：
// 不太好的设计
class WebBrowser
{
public:
    void clearCache();
    void clearHistory();
    void clearCookies();

    // 成员函数实现的便利函数
    void clearEverything()
    {
        clearCache();
        clearHistory();
        clearCookies();
    }
};

// 更好的设计是：
class WebBrowser
{
public:
    void clearCache();
    void clearHistory();
    void clearCookies();
    // 注意：没有clearEverything()成员函数
};

// 非成员非友元函数
void clearEverything(WebBrowser &browser)
{
    browser.clearCache();
    browser.clearHistory();
    browser.clearCookies();
}

// 命名空间的应用
// 更进一步，可以将相关的非成员函数组织在同一个命名空间中：
class WebBrowser
{
    // 基本功能...
};

namespace WebBrowserUtils
{
    void clearEverything(WebBrowser &browser);
    void configureForKids(WebBrowser &browser);
    void optimizeForSpeed(WebBrowser &browser);
    // 更多相关功能...
}

// 何时不适用
// 这个条款不适用于需要访问类非公有成员的函数。在这种情况下，你有两个选择：

// 1.将函数设为成员函数
// 2.如果必须是非成员函数，则将其设为友元函数

// 与面向对象设计的关系
// 这个条款可能看起来与传统的面向对象设计原则相悖，因为OO通常鼓励将行为与数据封装在一起。但实际上，这个条款是在强调更好的封装性和更灵活的设计。

// 总结
// 1.当函数逻辑只依赖于类的公有接口时，优先选择非成员非友元函数
// 2.这提高了封装性，增加了扩展性，并减少了编译依赖
// 3.可以使用命名空间组织相关的非成员函数
// 4.这个条款是C++ 特有的设计考量，体现了C++ 对封装和灵活性的重视

// 这个条款展示了C++ 设计中的一个重要思想：有时候，将功能从类中分离出来反而能提供更好的封装和更灵活的设计。